/**
 * \file wISelectionContours.cpp
 * \author Florian LANCE - Armand POLI
 * \version 1.0
 * \date octobre 2011
 */

#include "wISelectionContours.h"

using namespace std;

/// ########################################################################## CONSTRUCTEUR / DESTRUCTEUR

wISelectionContours::wISelectionContours()
{
    // initialisation connection
    QObject::connect(this,SIGNAL(clicked()),this, SLOT(ajouterPointTab()));
    QObject::connect(this,SIGNAL(KPressed()),this, SLOT(modifMax()));
}

wISelectionContours::~wISelectionContours(){}

/// ########################################################################## ACCESSEURS

Point wISelectionContours::getTab(const uint _i)
{
    return Point(tabPoints[_i].x(),tabPoints[_i].y());
}

vector<Point> wISelectionContours::tab()
{
    vector<Point> retour;
    for(uint i = 0; i < tabPoints.size(); i++)
    {
        retour.push_back(getTab(i));
    }
    return retour;
}

/// ########################################################################## MUTATEURS

void wISelectionContours::setPixmap(const QPixmap& _img)
{
    // initialisation du tableau de points
    tabPoints.clear();
    tabPointsFiltre.clear();

    this->resize(QSize(_img.width(),_img.height()));
    img = _img;
    update();
}

void wISelectionContours::setNbPoints(const int _nbPts)
{
    nbPtsContours = _nbPts;
}

void wISelectionContours::setTab(const tab_cx& _tab)
{
    tabPoints.clear();
    for(uint i = 0; i < _tab.size(); i++)
        tabPoints.push_back(QPoint(_tab[i].real(),_tab[i].imag()));
}


void wISelectionContours::setTabFiltre(const tab_cx& _tab)
{
    tabPointsFiltre.clear();
    for(uint i = 0; i < _tab.size(); i++)
        tabPointsFiltre.push_back(QPoint(_tab[i].real(),_tab[i].imag()));
}

/// ########################################################################## SLOTS


void wISelectionContours::keyPressEvent(QKeyEvent *)
{
    emit KPressed();
    update();
}

void wISelectionContours::mouseReleaseEvent(QMouseEvent*)
{
    emit clicked();
}


void wISelectionContours::paintEvent(QPaintEvent *)
{
      QPainter painter(this);
      painter.drawPixmap(QPoint(0,0),img);


      for(uint i = 0; i < tabPoints.size(); i++)
      {
          painter.setPen(Qt::blue);
          painter.drawRect(tabPoints[i].x()-4,tabPoints[i].y()-4,9,9);
          painter.setPen(Qt::red);

          if(i>0 )
          {
              painter.drawLine(tabPoints[i-1],tabPoints[i]);
              if(i == nbPtsContours-1)
                painter.drawLine(tabPoints[i],tabPoints[0]);

          }
      }

      for(uint i = 0; i < tabPointsFiltre.size(); i++)
      {
          painter.setPen(Qt::green);
          painter.drawRect(tabPointsFiltre[i].x()-4,tabPointsFiltre[i].y()-4,9,9);
          painter.setPen(Qt::yellow);

          if(i>0 )
          {
              painter.drawLine(tabPointsFiltre[i-1],tabPointsFiltre[i]);
              if(i == tabPointsFiltre.size()-1)
                painter.drawLine(tabPointsFiltre[i],tabPointsFiltre[0]);
          }
      }


}

void wISelectionContours::modifMax()
{
    std::cout << "key "  << std::endl;
    // modification du nombre de points total
    nbPtsContours = tabPoints.size();
    update();
}

void wISelectionContours::ajouterPointTab()
{
    // récupération position curseur
    QPoint posS = QCursor::pos();
    QPoint posW =  mapToGlobal(pos());
    QPoint posR(posS.x()- posW.x()+10, posS.y() - posW.y()+10 );
    std::cout << posS.x() << "." << posS.y() << std::endl;
    std::cout << posW.x() << "." << posW.y() << std::endl;
    std::cout << posR.x() << "." << posR.y() << std::endl << std::endl;


    // ajout du pixel pointé dans le tableau
    if(tabPoints.size() < nbPtsContours)
    {
        if(posR.x() >= 0 && posR.y() >=0 && posR.x() < img.width() && posR.y() < img.height() )
        {
            tabPoints.push_back(posR);
            std::cout << "Ajout du point (";
            std::cout << posR.x() << "." << posR.y() << ")" << std::endl;
            update();
        }
    }
    else std::cout << "Tous les points ont ete choisis." << std::endl;


}

/// ########################################################################## FONCTIONS


